
  
  #include "evolution.h"
  #include "mylib.h"
  #include <typeinfo>
  
  using namespace std;

  #define DEF_SEED1 1911
  #define DEF_SEED2 2105
  /* Sono i due semi di default per il generatore di numeri casuali. 
   */  
   
   #define MAX_RUNS 30
   /* E' il massimo numero di run che puo' essere effettuato.
   */
   #define DEF_RUNS 20
   /* Numero di run su cui vengono calcolati i valori statistici. 
    */

   #define DEFAULT_RES_FILE "evo_sper.stt"
   /* E' il nome del file di default dove vengono memorizzati i risultati.
   */
   
    
  
  
  /*
  ++++++++++++++++++++++++ Classe RUN ++++++++++++++++++++++++++++++++++++
  *** Definita il: 13/1/04
  Contiene tutti i dati ottenuti durante un run.
  *** Ultima modifica:
  */
  class Run
  {
   public:
     Run();
     /* E' la costruttrice della classe. E' vuota.
     */     
     void show(ofstream *out_stream);
     /* Visualizza sull'output passato come parametro l'andamento del run.
     */
     double give_best_fit(){return best_ind->give_fitness();}
     int give_best_iter(){return best_iter;}
     
   private:
     void alloc_mem(int iters_num, int vars_num);
     /* Alloca in maniera dinamica la memoria da utilizzare per la memoriz-
        zazione del run.
     */
     int best_iter;
     /* E' l'iterazione in cui e' stata ottenuta la migliore iterazione.
     */
     Individual *best_ind;
     /* E' il migliore individuo ottenuto durante il run.
     */
     int iters_done;
     /* E' il numero di iterazioni effettuate durante il run.
     */
     double avefit_story[MAX_ITERS];
     /* E' il vettore che contiene il valore medio della fitness della
        popolazione ottenute durante il run. 
     */
     double bestfit_story[MAX_ITERS];
     /* E' il vettore che contiene il valore della fitness del miglior indi-
        viduo durante il run.
     */
//     struct variable vars_story[MAX_ITERS][MAX_VARS];
     /* Memorizza l'andamento delle variabili durante il run. 
     */     
     struct variable **vars_story;
     /* E' un puntatore alla matrice, allocata dinamicamente, che memorizza
        l'andamento delle variabili durante il run. 
     */
     friend class Experiment;
  };
  
  /*
  ++++++++++++++++++++++++ Classe EXPERIMENT ++++++++++++++++++++++++++++++
  *** Definita il: 13/1/04
  Contiene tutti i dati ottenuti durante un esperimento effettuato con de-
  terminati parametri. 
  *** Ultima modifica:
  */
  class Experiment
  {
  public:
    
    Experiment();
    /* E' la costruttrice della classe. E' vuota.
    */   
    void execute(int args_num, char *args[], Evolution *evo_pointer);
    /* E' la procedura che esegue gli esperimenti previsti. Le viene passa-
       ta la riga di comando per leggere il nome del file passato dall'ut-
       ente. Il parametro evo_pointer e' il puntatore all'oggetto della cl-
       asse Evolution su cui bisogna fare la sperimentazione.        
    */
    void get_file_name();
    /* Legge dalla riga di comando il nome del file in cui scrivere i dati
       ottenuti.
    */
    void ini_seeds();
    /* Inizializza i seeds del generatore di numeri casuali utilizzando qu-
       elli memorizzati come attributi della classe. 
    */
    void show_run(int run, ofstream *out_stream);
    /* Mostra sull'output passato come parametro l'andamento del passato co-
       me primo parametro.
    */
     
    
  protected:
   // Run runs[MAX_RUNS];
    /* E' l'array di oggetti della classe Run che memorizza i risultati e i
       dati per ognuno dei run eseguiti. 
    */
    Run *runs;
    /* E' il puntatore all'array di oggetti della classe Run che memorizza 
       i risultati e i dati per ognuno dei run eseguiti. 
    */
    char res_file_name[MAX_CHAR_FILE_NAME];
    /* Questa stringa memorizza il nome del file dove memorizzare i risul-
       tati.
    */
    char par_file_name[MAX_CHAR_FILE_NAME];
    /* Questa stringa memorizza il nome del file che contiene i parametri
       relativi alla sperimentazione. 
    */
    Evolution *evo_ptr;
    /* E' il puntatore all'oggetto della classe Evolution che sta' eseguen-
       do i runs.
    */
    int N_vars;
    /* E' il numero di variabili di cui bisogna tenere conto nell'esperi-
       mento.
    */
    void get_params(int argc, char *argv[]);
    /* Legge dalla riga di comando oppure da file i parametri relativi alla
       sperimentazione da effettuare. Questi parametri vengono poi assegna-
       ti agli attributi della classe. Alla procedura viene passata la riga
       di comando. La procedura verifica in questo modo se aprire il file
       di default oppure uno passato dall'utente.
    */
     virtual void check_params();
     /* Verifica se i parametri dell'epserimento sono corretti.
     */
    virtual bool extract_param(char *line);
     /* Estrae dalla linea in input il parametro contenuto e lo assegna al
        relativo attributo.
     */
    virtual void set_def_params();
    /* Setta i parametri di default per la sperimentazione.
    */
    virtual void read_line_params(int argc, char *argv[]);
    /* Legge dalla riga di comando i parametri della sperimentazione even-
       tualmente passati dall'utente.
    */ 
    void alloc_runs_mem(int iters_num, int vars_num);
    /* Alloca memoria per la memorizzazione dei dati dei singoli runs. Il 
       primo parametro indica il numero di iterazioni dell'alogoritmo, men-
       tre il secondo specifica il numero di variabili da memorizzare. 
    */
    int find_best_run(problem_types type);
    /* Trova il miglior run ottenuto durante l'esperimento. 
    */
    void memo_run(int run);
    /* Memorizza tutti i dati di un run, nel array runs alla posizione pas-
       sata come parametro. 
    */   
    void comp_means();
    /* Calcola le medie relative ai dati "gloabali" del esperimento. 
    */
    void comp_deviations();
    /* Calcola le deviazioni relative ai dati "gloabali" del esperimento. 
    */
    void memo_data(int best, ofstream *out_stream);  
    /* Memorizza nel file dei risultati tutti i dati relativi all'esperi-
       mento. Il parametro best specifica in quale run e' stato ottenuto il
       risultato migliore. 
    */
    void free_memory(Evolution *evo_ptr);
    /* Libera la memoria utilizzata dall'oggetto della classe Evolution 
       passato come parametro.
    */
    void show_var(double ave, double dev , string name, ofstream 
                   *out_stream);
    /* Visualizza i dati relativi ad una variabile.Il primo parametro spe-
       cifica il valore medio, il secondo la deviazione, il terzo il suo 
       nome, il quarto l'output.   
    */
    void show_ave_run(ofstream *out_stream);
    /* visualizza sullo stream  passato come parametro l'andamento medio 
       dei run. */
    
    double ave_fit;
    /* Valore medio del costo delle  migliori soluzioni trovate calco-
       lato sul numero di prove effettuato. 
     */ 
    double dev_fit;
    /* Deviazione standard del costo delle migliori soluzioni trovate.
    */
  
    double ave_iter;
   /* Valore medio delle iterazioni delle  migliori soluzioni trovate
      calcolato sul numero di prove effettuato.          
    */
    double dev_iter;
    /* Deviazione standard delle iterazioni delle migliori soluzioni
       trovate.     
    */
    struct variable vars[MAX_VARS];
    /* Questo vettore memorizza i dati relativi alle variabili built-in ot-
       tenuti durante lespeprimento.
    */  
    int N_runs;
    /* E' il numero di run da effettuare.
    */
    int seed1, seed2;
    /* Memorizzano i valori dei semi utilizzati per il generatore di nu-
       meri casuali.
    */     
  };



